//
//  HMComposeView.swift
//  Weibo24
//
//  Created by apple on 17/4/2.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
import pop
import YYModel

//  自定义撰写视图的罩层
class HMComposeView: UIView {

    //  MARK: ---懒加载控件
    fileprivate lazy var bgImageView: UIImageView = {
        let imageView = UIImageView()
        //  设置截屏图片,把图片模糊化
        imageView.image = self.getScreenShot().applyLightEffect()
        return imageView
    }()
    
    //  标语
    fileprivate lazy var sloganImageView: UIImageView = UIImageView(image: UIImage(named: "compose_slogan"))
    
    //  保存6个撰写菜单按钮
    fileprivate lazy var composeButtonArray: [HMComposeButton] = [HMComposeButton]()
    //  目标控制器
    var target: UIViewController?
    //  compose数组
    lazy var composeArray: [HMCompose] = {
        return self.getPlistData()
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    //  添加控件设置约束
    private func setupUI() {
        //  设置当前视图的大小
        size = CGSize(width: ScreenWidth, height: ScreenHeight)
        addSubview(bgImageView)
        addSubview(sloganImageView)
        
        bgImageView.snp.makeConstraints { (make) in
            make.edges.equalTo(self)
        }
        sloganImageView.snp.makeConstraints { (make) in
            make.centerX.equalTo(self)
            make.top.equalTo(self).offset(150)
        }
        addChildButton()
       
    }
    
    //  添加子按钮
    fileprivate func addChildButton() {
        //  按钮的大小
        let buttonWidth: CGFloat = 80
        let buttonHeight: CGFloat = 110
        //  按钮之间的间距
        let buttonMargin: CGFloat = (width - 3 * buttonWidth) / 4
        for i in 0..<composeArray.count {
            let button = HMComposeButton()
            //  设置tag目的,通过点击按钮的tag获取对应模型
            button.tag = i
            //  添加点击事件
            button.addTarget(self, action: #selector(composeButtonAction(btn:)), for: .touchUpInside)
            //  根据下标获取模型
            let compose = composeArray[i]
            button.setImage(UIImage(named: compose.icon!), for: .normal)
            button.setTitle(compose.title!, for: .normal)
            button.titleLabel?.font = UIFont.systemFont(ofSize: 14)
            button.setTitleColor(UIColor.darkGray, for: .normal)
            //  计算列的索引
            let colIndex = i % 3
            //  计算行的索引
            let rowIndex = i / 3
            //  设置x坐标
            button.x = CGFloat(colIndex) * buttonWidth + CGFloat(colIndex + 1) * buttonMargin
            //  设置y坐标
            button.y = CGFloat(rowIndex) * buttonHeight + CGFloat(rowIndex) * buttonMargin + ScreenHeight
            button.size = CGSize(width: buttonWidth, height: buttonHeight)
            addSubview(button)
            //  保存到指定的数组里面
            composeButtonArray.append(button)
        }
        
    }
    
    //  MARK: ---   点击撰写菜单按钮的事件
    @objc private func composeButtonAction(btn: HMComposeButton) {
        //  通过tag获取模型
        let compose = composeArray[btn.tag]
        UIView.animate(withDuration: 0.25, animations: { 
            
            for button in self.composeButtonArray {
                button.alpha = 0.3
                if button == btn {
                    //  放大
                    button.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
                } else {
                    //  缩小
                    button.transform = CGAffineTransform(scaleX: 0.2, y: 0.2)
                }
            }
            
            
        }) { (_) in
            
            UIView.animate(withDuration: 0.25, animations: { 
                for button in self.composeButtonArray {
                    button.alpha = 1
                    //  重置
                    button.transform = CGAffineTransform.identity
                }
            }, completion: { (_) in
                //  弹出控制器
                //  1. 通过类名字符串转成class类型 -> 在swift里面自定义的类如果想要通过类名字符串转class,需要要加命名空间
                let classType = NSClassFromString(compose.className!) as! UIViewController.Type
                //  2. 通过class类型获取实例-> 把AnyClass转成对应的class类型(as? UIViewController.Type), 不能使用(),改成.init()
                let vc = classType.init()
                //  创建导航控制器
                let nav = HMNavigationViewController(rootViewController: vc)
                
                //  再次我需要视图控制器
                self.target?.present(nav, animated: true, completion: {
                    //  移除罩层
                    self.removeFromSuperview()
                })
            })
            
        }
        
        
    }
    
    //  pop动画
    fileprivate func popAnimation(isUp: Bool) {
        
        if isUp == false {
            //  如果是向下的动画,数组翻转
            composeButtonArray = composeButtonArray.reversed()
        }
        
        //  遍历按钮创建pop动画
        for (i, button) in composeButtonArray.enumerated() {
            //  创建pop动画
            let pop = POPSpringAnimation(propertyNamed: kPOPViewCenter)
            //  抖动幅度,值越大抖动幅度就越大
            pop?.springBounciness = 10
            //  弹簧速度,速度越快,动画结束越快
            pop?.springSpeed = 10
            //  动画开始时间的间隔,CACurrentMediaTime() 是系统的绝对时间
            pop?.beginTime = CACurrentMediaTime() + Double(i) * 0.025
            if isUp {
                //  动画执行的目的地
                pop?.toValue = CGPoint(x: button.centerX, y: button.centerY - 350)
            } else {
                //  动画执行的目的地
                pop?.toValue = CGPoint(x: button.centerX, y: button.centerY + 350)
            }
           
            //  执行动画, 因为动画属性分为view和layer, 如果layer这个动画需要添加到layer执行,否则在view上执行
            button.pop_add(pop, forKey: nil)
            
            
        }
    
    }
    
    //  截屏操作
    fileprivate func getScreenShot() -> UIImage {
        //  获取window
        let window = UIApplication.shared.keyWindow!
        //  开启图片上下文
        UIGraphicsBeginImageContext(window.size)
        //  afterScreenUpdates 表示是否更新后进行截屏,false表示不需要
        //  完成的是截屏的操作
        window.drawHierarchy(in: CGRect(origin: CGPoint.zero, size: window.size), afterScreenUpdates: false)
        //  从当前上下文中获取图片
        let currentImage = UIGraphicsGetImageFromCurrentImageContext()
        //  关闭图片上下文
        UIGraphicsEndImageContext()
        return currentImage!
    }
    
    //  显示罩层
    func show(target: UIViewController) {
        //  保存目标控制器
        self.target = target
        //  把视图添加到window上
//        UIApplication.shared.keyWindow?.addSubview(self)
        //  把视图添加到TabbarController的view上
        self.target?.view.addSubview(self)
        //  执行pop动画
        popAnimation(isUp: true)
        
    }
    
    //  获取plist里面的数据
    fileprivate func getPlistData() -> [HMCompose] {
        //  获取plist文件的路径
        let path = Bundle.main.path(forResource: "compose.plist", ofType: nil)!
        //  读取plist文件的数据
        let dicArray = NSArray(contentsOfFile: path) as! [[String: Any]]
        //  使用YYModel转成数组模型
        let modelArray = NSArray.yy_modelArray(with: HMCompose.self, json: dicArray) as! [HMCompose]
        return modelArray
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //  执行向下的动画
        popAnimation(isUp: false)
        //  gcd延时多少秒执行
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.35) { 
            self.removeFromSuperview()
        }
        
    }

}
